home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / BARNET / COMPILER / SATHER / !Sather / Library / Containrs / sa / map_incl < prev    next >
Text File  |  1996-06-01  |  6KB  |  183 lines

  1. ---------------------------> Sather 1.1 source file <--------------------------
  2. -- Author: Benedict A. Gomes <gomes@samosa.ICSI.Berkeley.EDU>
  3. -- Copyright (C) 1995, International Computer Science Institute
  4. -- $Id: map_incl.sa,v 1.7 1996/06/01 21:36:27 gomes Exp $
  5. --
  6. -- COPYRIGHT NOTICE: This code is provided WITHOUT ANY WARRANTY
  7. -- and is subject to the terms of the SATHER LIBRARY GENERAL PUBLIC
  8. -- LICENSE contained in the file: Sather/Doc/License of the
  9. -- Sather distribution. The license is also available from ICSI,
  10. -- 1947 Center St., Suite 600, Berkeley CA 94704, USA.
  11. -------------------------------------------------------------------
  12. class MAP{K,E} < $MAP{K,E} is  
  13.    -- An alias for H_MAP{K,E}. See the ancestors list.
  14.    include H_MAP{K,E}; 
  15. end;
  16. -------------------------------------------------------------------
  17. partial class MAP_INCL{ITP,ETP} is
  18.    -- Partial class for MAPs
  19.    include COMPARE{ETP};
  20.  
  21.    stub size: INT; 
  22.    -- Return the number of elements in the map
  23.    
  24.    stub elt!: ETP;
  25.    -- Yield the elements (targets) of the map
  26.    
  27.    stub ind!: ITP;
  28.    -- Yield the indices (keys) of the map
  29.    
  30.    stub aget(ind: ITP): ETP;
  31.    -- Return the target corresponding to index "ind"
  32.    
  33.    stub aset(ind: ITP,e: ETP);
  34.    -- Set the target of index "ind" to "e"
  35.  
  36.    -- ------------------- Access  -------------------------
  37.    test_if(test:ROUT{ETP}:BOOL,out ind: ITP, out elt: ETP):BOOL is
  38.       -- Return true if an element satisfies test "test"
  39.       -- Arg "ind" is set to the index of the element satisfying "test"
  40.       -- Arg "elt" is set to the element satisfying "test"
  41.       loop r ::= ind!; 
  42.      e ::= aget(r);
  43.      if test.call(e) then ind := r; elt := e; return true end;  
  44.       end; 
  45.       return false;
  46.    end;
  47.  
  48.    inds: ARRAY{ITP} is
  49.       -- Return an index array which is the same size as self and
  50.       -- is set to the values of the indices
  51.       sz: INT := size;
  52.       res: ARRAY{ITP} := #(sz);
  53.       i: INT := 0;
  54.       loop until!(i >= sz); res[i] := ind!; i := i + 1; end;
  55.       return res;
  56.    end;
  57.  
  58.    --              ------ Queries/Comparison --------------
  59.    has(e: ETP): BOOL is return has_elt(e) end;
  60.    
  61.    has_elt(e:ETP):BOOL is
  62.       -- True if the self has an element which is `elt_eq' to `e'.
  63.       if void(self) then return false end;
  64.       loop if elt_eq(elt!,e) then return true end  end;
  65.       return false 
  66.    end;
  67.  
  68.    equals(e: $RO_MAP{ITP,ETP}): BOOL is
  69.       -- Returns true if all of "e"'s elements are equal to self's elts
  70.       -- Ordering is an issue. Should be redefined to be more
  71.       -- precise for particular descendants
  72.       if e.size /= size then return false end;
  73.       loop k ::= ind!;
  74.      a1 ::= aget(k); a2 ::= e.aget(k);
  75.      if ~elt_eq(a1,a2) then return false end 
  76.       end;
  77.       return true
  78.    end;
  79.  
  80.    --              ------ Conversion ----------------------
  81.     str: STR is
  82.       -- Prints out a string version of the array of the components 
  83.       -- that are under $STR, and their associated indices
  84.       res ::= #FSTR("{");
  85.       loop  
  86.      res := res+",".separate!("["+ind_str(ind!)+"]="+elt_str(elt!));  
  87.       end;
  88.       res := res +"}";
  89.       return(res.str);
  90.    end;
  91.  
  92.    elt_str: STR is
  93.       -- Prints out a string version of the array of the components 
  94.       -- that are under $STR, and their associated indices
  95.       res ::= #FSTR("");
  96.       loop res:=res+",".separate!(elt_str(elt!)); end;
  97.       return(res.str);
  98.    end;
  99.                   
  100.    --              ------ Basic Operations ----------------
  101.    count_if( test:ROUT{ETP}:BOOL ):INT is
  102.       -- The number of elements which satisfy `test'.
  103.       -- Self may be void.
  104.       r::=0; 
  105.       loop if test.call(elt!) then r:=r+1 end   end;
  106.       return r 
  107.    end;
  108.  
  109.    count(v:ETP):INT is
  110.       -- The number of elements that are `elt_eq' to `v'.
  111.       -- Self may be void.
  112.       r::=0; 
  113.       loop if elt_eq(elt!,v) then r:=r+1 end   end;
  114.       return r 
  115.    end;
  116.  
  117.    replace(o,n:ETP) is
  118.       -- Replace elements that are `elt_eq' to `o' by `n' wherever it occurs
  119.       loop i ::= ind!; e::=aget(i); if elt_eq(e,o) then aset(i,n); end; end;
  120.    end;
  121.  
  122.    replace_if(test:ROUT{ETP}:BOOL, n:ETP) is
  123.       -- Replace elements that satisfy `test' by `n'.
  124.       loop i ::= ind!; e::=aget(i); if test.call(e) then aset(i,n); end; end;
  125.    end;
  126.    
  127.    map(r:ROUT{ETP}:ETP) is
  128.       -- Set each element of self to the result of applying `r' to it.
  129.       loop i ::= ind!; aset(i,r.call(aget(i)))  end 
  130.    end;
  131.  
  132.    permute_into( new_pos :$RO_MAP{ITP,ITP}, destination: $MAP{ITP,ETP}) is
  133.       -- Copy the entries from orig_arr into self using
  134.       -- the permutation array "new_positions" 
  135.       loop 
  136.      i: ITP := ind!;
  137.      new_i: ITP := new_pos[i];
  138.      assert(destination.has_ind(new_i));
  139.      destination.aset(new_i,aget(i));
  140.       end;
  141.    end;
  142.       
  143.    some( test:ROUT{ETP}:BOOL ):BOOL is
  144.       -- True if some element of self satisfies `test'. 
  145.       -- Self may be void.
  146.       loop if test.call(elt!) then return true end  end;
  147.       return false 
  148.    end;
  149.  
  150.    every( test:ROUT{ETP}:BOOL ):BOOL is
  151.       -- True if every element of self satisfies `test'.
  152.       -- Self may be void.
  153.       loop if ~test.call(elt!) then return false end  end; 
  154.       return true 
  155.    end;
  156.  
  157.    notany( test:ROUT{ETP}:BOOL ):BOOL is
  158.       -- True if none of the elements of self satisfies `test'.
  159.       -- Self may be void.
  160.       loop if test.call(elt!) then return false end end; 
  161.       return true 
  162.    end;
  163.    
  164.    notevery( test:ROUT{ETP}:BOOL ):BOOL is
  165.       -- True if not every element of self satisfies `test'.
  166.       -- Self may be void.
  167.       loop if ~test.call(elt!) then return true end  end;
  168.       return false 
  169.    end;
  170.  
  171.    private ind_str(i: ITP): STR is
  172.       typecase i
  173.       when $STR then return i.str  else return "Unprintable Index" end;
  174.    end;
  175.    
  176.    private elt_str(e: ETP): STR is
  177.       typecase e 
  178.       when $STR then return e.str  else return "Unprintable Element" end;
  179.    end;
  180.  
  181. end;
  182. --=============================================================================
  183.